#ifndef _WX_GRAPHICS_DC_H_
#define _WX_GRAPHICS_DC_H_

#include "wx/geometry.h"
#include "wx/dynarray.h"
#include "wx/graphics.h"

class wxWindowDC;

class wxGCDC: public wxDC {
    DECLARE_DYNAMIC_CLASS( wxGCDC )
    DECLARE_NO_COPY_CLASS( wxGCDC )

  public:
    wxGCDC( const wxWindowDC& dc );
    wxGCDC();
    virtual ~wxGCDC();
    void Init();
    virtual void Clear();
    virtual bool StartDoc( const wxString& message );
    virtual void EndDoc();
    virtual void StartPage();
    virtual void EndPage();
    void Flush();
    virtual void SetFont( const wxFont& font );
    virtual void SetPen( const wxPen& pen );
    virtual void SetBrush( const wxBrush& brush );
    virtual void SetBackground( const wxBrush& brush );
    virtual void SetBackgroundMode( int mode );
    virtual void SetPalette( const wxPalette& palette );
    virtual void DestroyClippingRegion();
    virtual wxCoord GetCharHeight() const;
    virtual wxCoord GetCharWidth() const;
    virtual bool CanDrawBitmap() const;
    virtual bool CanGetTextExtent() const;
    virtual int GetDepth() const;
    virtual wxSize GetPPI() const;
    virtual void SetMapMode( int mode );
    virtual void SetUserScale( double x, double y );
    virtual void SetLogicalScale( double x, double y );
    virtual void SetLogicalOrigin( wxCoord x, wxCoord y );
    virtual void SetDeviceOrigin( wxCoord x, wxCoord y );
    virtual void SetAxisOrientation( bool xLeftRight, bool yBottomUp );
    virtual void SetLogicalFunction( int function );
    virtual void SetTextForeground( const wxColour& colour );
    virtual void SetTextBackground( const wxColour& colour );
    virtual void ComputeScaleAndOrigin();
    wxGraphicsContext* GetGraphicsContext() { return m_graphicContext; }
    virtual void SetGraphicsContext( wxGraphicsContext* ctx );
  protected:
    virtual bool DoFloodFill( wxCoord x, wxCoord y, const wxColour& col,
                              int style = wxFLOOD_SURFACE );
    virtual void DoGradientFillLinear( const wxRect& rect,
                                       const wxColour& initialColour,
                                       const wxColour& destColour,
                                       wxDirection nDirection = wxEAST );
    virtual void DoGradientFillConcentric( const wxRect& rect,
                                           const wxColour& initialColour,
                                           const wxColour& destColour,
                                           const wxPoint& circleCenter );
    virtual bool DoGetPixel( wxCoord x, wxCoord y, wxColour *col ) const;
    virtual void DoDrawPoint( wxCoord x, wxCoord y );

    #if wxUSE_SPLINES
    virtual void DoDrawSpline( wxList *points );
    #endif

    virtual void DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 );
    virtual void DoDrawArc( wxCoord x1, wxCoord y1,
                            wxCoord x2, wxCoord y2,
                            wxCoord xc, wxCoord yc );

    virtual void DoDrawCheckMark( wxCoord x, wxCoord y,
                                  wxCoord width, wxCoord height );
    virtual void DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord w, wxCoord h,
                                    double sa, double ea );

    virtual void DoDrawRectangle( wxCoord x, wxCoord y, wxCoord width, wxCoord height );
    virtual void DoDrawRoundedRectangle( wxCoord x, wxCoord y,
                                         wxCoord width, wxCoord height,
                                         double radius );
    virtual void DoDrawEllipse( wxCoord x, wxCoord y, wxCoord width, wxCoord height );

    virtual void DoCrossHair( wxCoord x, wxCoord y );

    virtual void DoDrawIcon( const wxIcon& icon, wxCoord x, wxCoord y );
    virtual void DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y,
                               bool useMask = false );

    virtual void DoDrawText( const wxString& text, wxCoord x, wxCoord y );
    virtual void DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord y,
                                    double angle );

    virtual bool DoBlit( wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
                         wxDC *source, wxCoord xsrc, wxCoord ysrc,
                         int rop = wxCOPY, bool useMask = false, wxCoord xsrcMask = -1, wxCoord ysrcMask = -1 );

    virtual void DoGetSize( int *, int * ) const;
    virtual void DoGetSizeMM( int* width, int* height ) const;

    virtual void DoDrawLines( int n, wxPoint points[],
                              wxCoord xoffset, wxCoord yoffset );
    virtual void DoDrawPolygon( int n, wxPoint points[],
                                wxCoord xoffset, wxCoord yoffset,
                                int fillStyle = wxODDEVEN_RULE );
    virtual void DoDrawPolyPolygon( int n, int count[], wxPoint points[],
                                    wxCoord xoffset, wxCoord yoffset,
                                    int fillStyle );
    virtual void DoSetClippingRegionAsRegion( const wxRegion& region );
    virtual void DoSetClippingRegion( wxCoord x, wxCoord y,
                                      wxCoord width, wxCoord height );
    virtual void DoGetTextExtent( const wxString& string,
                                  wxCoord *x, wxCoord *y,
                                  wxCoord *descent = NULL,
                                  wxCoord *externalLeading = NULL,
                                  wxFont *theFont = NULL ) const;
    virtual bool DoGetPartialTextExtents( const wxString& text, wxArrayInt& widths ) const;
  protected:
    bool m_logicalFunctionSupported;
    double       m_mm_to_pix_x, m_mm_to_pix_y;
    wxGraphicsMatrix m_matrixOriginal;
    wxGraphicsMatrix m_matrixCurrent;

    double m_formerScaleX, m_formerScaleY;

    wxGraphicsContext* m_graphicContext;
};

#endif
